package edu.tfh.s2.ehkbot.simulation;

import javax.swing.JLabel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.JToggleButton;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

import edu.tfh.s2.ehkbot.EHKBotMain;
import edu.tfh.s2.ehkbot.daten.Protokoll;
import edu.tfh.s2.ehkbot.daten.Zeitgeber;
import edu.tfh.s2.ehkbot.gerete.EHKBot.EHKBotInitFail;
import edu.tfh.s2.ehkbot.inventar.Einkaufsauftrag;
import edu.tfh.s2.ehkbot.inventar.Einkaufsposten;
import edu.tfh.s2.ehkbot.inventar.Einkaufsposten.EinkaufspostenStatus;

import java.util.Date;
import java.util.Vector;

/**
 * This code was edited or generated using CloudGarden's Jigloo SWT/Swing GUI Builder, which is free for
 * non-commercial use. If Jigloo is being used commercially (ie, by a corporation, company or business for any
 * purpose whatever) then you should purchase a license for each developer using Jigloo. Please visit
 * www.cloudgarden.com for details. Use of Jigloo implies acceptance of these licensing terms. A COMMERCIAL
 * LICENSE HAS NOT BEEN PURCHASED FOR THIS MACHINE, SO JIGLOO OR THIS CODE CANNOT BE USED LEGALLY FOR ANY
 * CORPORATE OR COMMERCIAL PURPOSE.
 */
public class TerminalGUI extends JFrame {

	private static TerminalGUI instance = null; // @jve:decl-index=0:visual-constraint="810,-8"
	private static final long serialVersionUID = 1L;

	public static TerminalGUI getInstance() {
		if (instance == null) {
			instance = new TerminalGUI();
			instance.setTitle("EHKBot TerminalGUI View");
		}
		return instance;
	}

	private JTextField auftragsNummerjTextField = null;
	private JScrollPane bearbeitetePostenjScrollPane = null;
	private JTable bearbeitetePostenjTable = null;
	private JButton bearbeitetePostenScrollDownjButton3 = null;
	private JButton BearbeitetePostenScrollUpjButton2 = null;
	private JLabel jLabel = null;
	private JLabel jLabel1 = null;
	private JLabel jLabel2 = null;
	private JLabel jLabel3 = null;
	private JLabel jLabel4 = null;
	private JToggleButton notAusjToggleButton = null;
	private JScrollPane offenePostenjScrollPane = null;
	private JTable offenePostenjTable = null;
	private JButton offenePostenScrollDownjButton = null;

	private JButton offenePostenScrollUpjButton = null;

	private JTextField zeitVergangenjTextField = null;

	public TerminalGUI() {
		super();
		initialize();
		this.addWindowListener(new WindowAdapter() {
			  public void windowClosing(WindowEvent evt) {
			    SimulationGUI.getInstance().getZeigeRoboterTermineljToggleButton().setSelected(false);
			  }
		});
	}

	private JTextField getAuftragsNummerjTextField() {
		if (auftragsNummerjTextField == null) {
			auftragsNummerjTextField = new JTextField();
			auftragsNummerjTextField.setBounds(new Rectangle(225, 45, 136, 16));
			auftragsNummerjTextField.setEditable(false);
		}
		return auftragsNummerjTextField;
	}

	private JScrollPane getBearbeitetePostenjScrollPane() {
		if (bearbeitetePostenjScrollPane == null) {
			bearbeitetePostenjScrollPane = new JScrollPane();
			bearbeitetePostenjScrollPane.setBounds(new Rectangle(30, 285, 541, 106));
			bearbeitetePostenjScrollPane.setViewportView(getBearbeitetePostenjTable());
		}
		return bearbeitetePostenjScrollPane;
	}

	private JTable getBearbeitetePostenjTable() {
		if (bearbeitetePostenjTable == null) {
			String rowData[][] = { { "", "", "", "" } };
			String columnNames[] = { "Artikel Nummer", "Name", "Menge", "Status" };
			bearbeitetePostenjTable = new JTable(rowData, columnNames);
			bearbeitetePostenjTable.setEnabled(false);
		}
		return bearbeitetePostenjTable;
	}

	private JButton getBearbeitetePostenScrollDownjButton3() {
		if (bearbeitetePostenScrollDownjButton3 == null) {
			bearbeitetePostenScrollDownjButton3 = new JButton();
			bearbeitetePostenScrollDownjButton3.setBounds(new Rectangle(585, 345, 91, 46));
			bearbeitetePostenScrollDownjButton3.setText("Runter");
			bearbeitetePostenScrollDownjButton3.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					bearbeitetePostenjScrollPane.getVerticalScrollBar().setValue(
						bearbeitetePostenjScrollPane.getVerticalScrollBar().getValue() + 20);
				}
			});
		}
		return bearbeitetePostenScrollDownjButton3;
	}

	private JButton getBearbeitetePostenScrollUpjButton2() {
		if (BearbeitetePostenScrollUpjButton2 == null) {
			BearbeitetePostenScrollUpjButton2 = new JButton();
			BearbeitetePostenScrollUpjButton2.setBounds(new Rectangle(585, 285, 91, 46));
			BearbeitetePostenScrollUpjButton2.setText("Hoch");
			BearbeitetePostenScrollUpjButton2.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					bearbeitetePostenjScrollPane.getVerticalScrollBar().setValue(
						bearbeitetePostenjScrollPane.getVerticalScrollBar().getValue() - 20);
				}
			});
		}
		return BearbeitetePostenScrollUpjButton2;
	}

	private JToggleButton getNotAusjToggleButton() {
		if (notAusjToggleButton == null) {
			notAusjToggleButton = new JToggleButton();
			notAusjToggleButton.setBounds(new Rectangle(540, 15, 121, 76));
			notAusjToggleButton.setText("Notaus");
			notAusjToggleButton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent evt) {
					if (notAusjToggleButton.isSelected())
						EHKBotMain.getInstance().getEHKBot().stelleFahrbetriebEin();
					else
						try {
							EHKBotMain.getInstance().getEHKBot().fahrbetriebAufnaehmen();
						} catch (EHKBotInitFail e) {
							Protokoll.getInstanc().exception(e);
						}
				}
			});
		}
		return notAusjToggleButton;
	}

	private JScrollPane getOffenePostenjScrollPane() {
		if (offenePostenjScrollPane == null) {
			offenePostenjScrollPane = new JScrollPane();
			offenePostenjScrollPane.setBounds(new Rectangle(30, 135, 541, 106));
			offenePostenjScrollPane.setViewportView(getOffenePostenjTable());
		}
		return offenePostenjScrollPane;
	}

	private JTable getOffenePostenjTable() {
		if (offenePostenjTable == null) {
			String rowData[][] = { { "", "", "" } };

			String columnNames[] = { "Barcode", "Name", "Menge" };

			offenePostenjTable = new JTable(rowData, columnNames);
			offenePostenjTable.setEnabled(false);
		}
		return offenePostenjTable;
	}

	private JButton getOffenePostenScrollDownjButton() {
		if (offenePostenScrollDownjButton == null) {
			offenePostenScrollDownjButton = new JButton();
			offenePostenScrollDownjButton.setBounds(new Rectangle(585, 195, 91, 46));
			offenePostenScrollDownjButton.setText("Runter");
			offenePostenScrollDownjButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					offenePostenjScrollPane.getVerticalScrollBar().setValue(
						offenePostenjScrollPane.getVerticalScrollBar().getValue() + 20);
				}
			});
		}
		return offenePostenScrollDownjButton;
	}

	private JButton getOffenePostenScrollUpjButton() {
		if (offenePostenScrollUpjButton == null) {
			offenePostenScrollUpjButton = new JButton();
			offenePostenScrollUpjButton.setBounds(new Rectangle(585, 135, 91, 46));
			offenePostenScrollUpjButton.setText("Hoch");
			offenePostenScrollUpjButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					JScrollBar scrollbar = offenePostenjScrollPane.getVerticalScrollBar();
					scrollbar.setValue(scrollbar.getValue() - 20);
				}
			});
		}
		return offenePostenScrollUpjButton;
	}

	private JTextField getZeitVergangenjTextField() {
		if (zeitVergangenjTextField == null) {
			zeitVergangenjTextField = new JTextField();
			zeitVergangenjTextField.setBounds(new Rectangle(225, 60, 136, 16));
			zeitVergangenjTextField.setEditable(false);
		}
		return zeitVergangenjTextField;
	}

	private void initialize() {
		jLabel4 = new JLabel();
		jLabel4.setBounds(new Rectangle(60, 60, 151, 16));
		jLabel4.setText("Zeit vergangen seit start");
		jLabel3 = new JLabel();
		jLabel3.setBounds(new Rectangle(60, 45, 151, 16));
		jLabel3.setText("Auftrags Nummer");
		jLabel2 = new JLabel();
		jLabel2.setBounds(new Rectangle(30, 105, 121, 16));
		jLabel2.setText("Offene Posten");
		jLabel1 = new JLabel();
		jLabel1.setBounds(new Rectangle(30, 255, 121, 16));
		jLabel1.setText("Bearbeitete Posten");
		jLabel = new JLabel();
		jLabel.setBounds(new Rectangle(30, 15, 106, 19));
		jLabel.setText("Aktulle Auftrag");
		this.setSize(706, 510);
		this.setLayout(null);
		this.add(jLabel, null);
		this.add(getOffenePostenjScrollPane(), null);
		this.add(getOffenePostenScrollUpjButton(), null);
		this.add(getOffenePostenScrollDownjButton(), null);
		this.add(getBearbeitetePostenjScrollPane(), null);
		this.add(getBearbeitetePostenScrollUpjButton2(), null);
		this.add(getBearbeitetePostenScrollDownjButton3(), null);
		this.add(jLabel1, null);
		this.add(getNotAusjToggleButton(), null);
		this.add(jLabel2, null);
		this.add(jLabel3, null);
		this.add(jLabel4, null);
		this.add(getAuftragsNummerjTextField(), null);
		this.add(getZeitVergangenjTextField(), null);
	}

	/**
	 * Aktualiesiert die Anzeige des Einkaufsauftrag
	 * 
	 * @param auftrag
	 */
	public void refresh(Einkaufsauftrag auftrag) {
		auftragsNummerjTextField.setText(new Integer(auftrag.getAuftragID()).toString());
		/*
		 * Berechnet die vergangene Zeit.
		 */
		Date start = auftrag.getEingangsdatum();
		Date now = Zeitgeber.getInstance().getCurrentDate();
		long zeitVergangenInS = (long) ((now.getTime() - start.getTime()) / 1000);

		long stunden = (long) Math.floor(zeitVergangenInS / 60 / 60);
		zeitVergangenInS = zeitVergangenInS - stunden * 60 * 60;
		long minuten = (long) Math.floor(zeitVergangenInS / 60);
		zeitVergangenInS = zeitVergangenInS - minuten * 60;
		zeitVergangenjTextField.setText(String.format("%02d:%02d:%02d", stunden, minuten, zeitVergangenInS));

		/*
		 * Teil die Posten in erlädig und noch zu erlädigen auf
		 */
		Vector<Einkaufsposten> einkaufsPosten = auftrag.getEinkaufsposten();
		Vector<Einkaufsposten> nochZuBearbeiten = new Vector<Einkaufsposten>();
		Vector<Einkaufsposten> bearbeitet = new Vector<Einkaufsposten>();

		for (int i = 0; i < einkaufsPosten.size(); ++i) {
			if (einkaufsPosten.get(i).getStatus() == EinkaufspostenStatus.UNERLAEDIGT)
				nochZuBearbeiten.add(einkaufsPosten.get(i));
			else
				bearbeitet.add(einkaufsPosten.get(i));
		}

		String[][] datenTablele = new String[nochZuBearbeiten.size()][3];

		for (int i = 0; i < nochZuBearbeiten.size(); ++i) {
			datenTablele[i][0] = new Integer(nochZuBearbeiten.get(i).getWare().getBarcode()).toString();
			datenTablele[i][1] = nochZuBearbeiten.get(i).getWare().getName();
			datenTablele[i][2] = new Integer(nochZuBearbeiten.get(i).getMenge()).toString();
		}

		DefaultTableModel tabelenModel = new DefaultTableModel(datenTablele, new String[] { "Barcode",
						"Name", "Menge" });
		getOffenePostenjTable().setModel(tabelenModel);

		datenTablele = new String[bearbeitet.size()][4];

		for (int i = 0; i < bearbeitet.size(); ++i) {
			datenTablele[i][0] = new Integer(bearbeitet.get(i).getWare().getBarcode()).toString();
			datenTablele[i][1] = bearbeitet.get(i).getWare().getName();
			datenTablele[i][2] = new Integer(bearbeitet.get(i).getMenge()).toString();
			datenTablele[i][3] = bearbeitet.get(i).getStatus().toString();
		}

		tabelenModel = new DefaultTableModel(datenTablele, new String[] { "Barcode", "Name", "Menge",
						"Status" });
		getBearbeitetePostenjTable().setModel(tabelenModel);

		repaint();
	}
} // @jve:decl-index=0:visual-constraint="68,-105"
